package bishiqiangxun;
/* 棋盘上 A点有一个过河卒，需要走到目标 B 点。卒行走的规则：可以向下、或者向右。同时在棋盘上 C 点有一个对方的马，该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示，A 点 (0, 0)、B点(n,m)，同样马的位置坐标是需要给出的。
现在要求你计算出卒从 A点能够到达 B点的路径的条数，假设马的位置(x,y)是固定不动的，并不是卒走一步马走一步。
链接:https://www.nowcoder.com/practice/8439d41faa254418a3146c8cc0a68d62?tpId=196&tqId=40500&ru=/exam/oj
 */
public class Test1 {
    public int crossRiver (int n, int m, int x, int y) {
        //先定义一个dp数组
        int[][] dp = new int[n+21][m+2];  //直接扩大数组  直接将一个初始化为0  就行
        dp[1][0] = 1;
        //数组扩大了  马位置的下标 和  dp数组的下标就不一样了  差了1   因为扩大了
        x = x+1;
        y = y+1;

        for(int i = 1; i <= n+1;i++) {
            for(int j = 1;j <= m+1; j++) {
                //如果是马能到达的位置 就返回0
                if((i == x && j == y) ||(i!= x && j !=y && Math.abs(i-x)+Math.abs(j-y) == 3)) {
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[n+1][m+1];
    }
    public static void main(String[] args) {

    }
}
